#pragma once
#include <zCoreConfig.hpp>
#include <LibraryConfig.hpp>
#include "../common.hpp"
#ifdef ZZZ_LIB_BOOST
#define BOOST_FILESYSTEM_VERSION 2
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#endif
namespace zzz{
//////////////////////////////////////////////////////////////////////////
//path
#ifdef ZZZ_LIB_BOOST
typedef boost::filesystem::path Path;
#else
typedef string Path;
#endif

ZCORE_FUNC string GetExt(const string &str);
ZCORE_FUNC string GetBase(const string &str);
ZCORE_FUNC string GetFilename(const string &str);
ZCORE_FUNC string GetPath(const string &str);
ZCORE_FUNC vector<string> SplitPath(const string &path);
ZCORE_FUNC string CompleteDirName(const string &str);
ZCORE_FUNC string PathFile(const string &path,const string &file);
ZCORE_FUNC string RelativeTo(const string &a,const string &to_a);
ZCORE_FUNC void NormalizePath(string &path);
ZCORE_FUNC bool PathEquals(const string &f1, const string &f2);
ZCORE_FUNC string CurrentPath();
ZCORE_FUNC string InitialPath();

///////////////////////////////////////////////////////////////////////////
//file operation
ZCORE_FUNC bool FileCanOpen(const string &filename);
ZCORE_FUNC bool FileExists(const string &filename);
ZCORE_FUNC bool DirExists(const string &filename);
ZCORE_FUNC bool IsSymlink(const string &filename);
ZCORE_FUNC void ListFileOnly(const string &path, bool recursive, vector<string> &files);
ZCORE_FUNC void ListDirOnly(const string &path, bool recursive, vector<string> &files);
ZCORE_FUNC void ListFileAndDir(const string &path, bool recursive, vector<string> &files);
ZCORE_FUNC bool CopyFile(const string &from, const string &to);
ZCORE_FUNC bool RenameFile(const string &from, const string &to);
ZCORE_FUNC bool RemoveFile(const string &f, bool recursive=false);
ZCORE_FUNC bool MakeDir(const string &dir);
ZCORE_FUNC bool MakeHardLink(const string &from, const string &to);
ZCORE_FUNC bool MakeSymLink(const string &from, const string &to);

//////////////////////////////////////////////////////////////////////////
//file
ZCORE_FUNC unsigned long GetFileSize(const string &filename);
ZCORE_FUNC bool ReadFileToString(const string &filename,char **buf);
ZCORE_FUNC bool ReadFileToString(const string &filename,string &buf);
ZCORE_FUNC bool SaveStringToFile(const string &filename,string &buf);
ZCORE_FUNC string RemoveComments_copy(const string &buf);
ZCORE_FUNC bool RemoveComments(string &buf);
///////////////////////////////////////////////////////////////////////////
//help function
ZCORE_FUNC zuint FileCountLine(ifstream &fi);

}